/*
 * Copyright [2022] [https://www.xiaonuo.vip]
 *
 * Snowy采用APACHE LICENSE 2.0开源协议，您在使用过程中，需要注意以下几点：
 *
 * 1.请不要删除和修改根目录下的LICENSE文件。
 * 2.请不要删除和修改Snowy源码头部的版权声明。
 * 3.本项目代码可免费商业使用，商业使用请保留源码和相关描述文件的项目出处，作者声明等。
 * 4.分发源码时候，请注明软件出处 https://www.xiaonuo.vip
 * 5.不可二次分发开源参与同类竞品，如有想法可联系团队xiaonuobase@qq.com商议合作。
 * 6.若您的项目无法满足以上几点，需要更多功能代码，获取Snowy商业授权许可，请在官网购买授权，地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.biz.modular.cabinetpermissionlog.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import vip.xiaonuo.biz.modular.cabinetpermission.vo.BizCabinetPermissionResp;
import vip.xiaonuo.biz.modular.cabinetpermissionlog.vo.BizCabinetPermissionLogResp;
import vip.xiaonuo.common.enums.CommonSortOrderEnum;
import vip.xiaonuo.common.exception.CommonException;
import vip.xiaonuo.common.page.CommonPageRequest;
import vip.xiaonuo.biz.modular.cabinetpermissionlog.entity.BizCabinetPermissionLog;
import vip.xiaonuo.biz.modular.cabinetpermissionlog.mapper.BizCabinetPermissionLogMapper;
import vip.xiaonuo.biz.modular.cabinetpermissionlog.param.BizCabinetPermissionLogAddParam;
import vip.xiaonuo.biz.modular.cabinetpermissionlog.param.BizCabinetPermissionLogEditParam;
import vip.xiaonuo.biz.modular.cabinetpermissionlog.param.BizCabinetPermissionLogIdParam;
import vip.xiaonuo.biz.modular.cabinetpermissionlog.param.BizCabinetPermissionLogPageParam;
import vip.xiaonuo.biz.modular.cabinetpermissionlog.service.BizCabinetPermissionLogService;

import java.util.Date;
import java.util.List;

/**
 * 权限日志Service接口实现类
 *
 * @author kongxm
 * @date 2022/11/21 21:35
 **/
@Service
public class BizCabinetPermissionLogServiceImpl extends ServiceImpl<BizCabinetPermissionLogMapper, BizCabinetPermissionLog> implements BizCabinetPermissionLogService {

    @Override
    public Page<BizCabinetPermissionLogResp> page(BizCabinetPermissionLogPageParam param) {
        Page<BizCabinetPermissionLogResp> page = getBaseMapper().page(Page.of(param.getCurrent(), param.getSize()), param);
        page.getRecords().forEach(item -> {
//            if (item.getPermEndTime() == null) return; why add this code? confusing.
            // 计算剩余天数
            if (item.getPermEndTime() != null) {
                long remainDays = DateUtil.betweenDay(new Date(), item.getPermEndTime(), false);
                remainDays = remainDays < 0 ? 0 : remainDays;
                item.setRemainDays(remainDays);
            }
            // 计算授权天数
            if (item.getPermEndTime() != null && item.getPermStartTime() != null) {
                long permDays = DateUtil.betweenDay(item.getPermEndTime(), item.getPermStartTime(), false);
                item.setPermDays(permDays);
            }
            // 计算冻结天数
            if (item.getFrozenEndTime() != null && item.getFrozenStartTime() != null) {
                long frozenDays = DateUtil.betweenDay(item.getFrozenEndTime(), item.getFrozenStartTime(), false);
                item.setFrozenDays(frozenDays);
            }
        });
        return page;
    }

    @Override
    public void add(BizCabinetPermissionLogAddParam bizCabinetPermissionLogAddParam) {
        BizCabinetPermissionLog bizCabinetPermissionLog = BeanUtil.toBean(bizCabinetPermissionLogAddParam, BizCabinetPermissionLog.class);
        this.save(bizCabinetPermissionLog);
    }

    @Override
    public void edit(BizCabinetPermissionLogEditParam bizCabinetPermissionLogEditParam) {
        BizCabinetPermissionLog bizCabinetPermissionLog = this.queryEntity(bizCabinetPermissionLogEditParam.getId());
        BeanUtil.copyProperties(bizCabinetPermissionLogEditParam, bizCabinetPermissionLog);
        this.updateById(bizCabinetPermissionLog);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(List<BizCabinetPermissionLogIdParam> bizCabinetPermissionLogIdParamList) {
        // 执行删除
        this.removeBatchByIds(CollStreamUtil.toList(bizCabinetPermissionLogIdParamList, BizCabinetPermissionLogIdParam::getId));
    }

    @Override
    public BizCabinetPermissionLog detail(BizCabinetPermissionLogIdParam bizCabinetPermissionLogIdParam) {
        return this.queryEntity(bizCabinetPermissionLogIdParam.getId());
    }

    @Override
    public BizCabinetPermissionLog queryEntity(String id) {
        BizCabinetPermissionLog bizCabinetPermissionLog = this.getById(id);
        if (ObjectUtil.isEmpty(bizCabinetPermissionLog)) {
            throw new CommonException("权限日志不存在，id值为：{}", id);
        }
        return bizCabinetPermissionLog;
    }
}
